1 Setup

Libraries

library(ggExtra)
library(kableExtra)
library(psych)
library(qwraps2)
library(stats)
library(tidyverse)
library(ggpubr)
library(broom)
library(skimr)
library(jtools)
require(ggforce)

Set options and theme

Import data

mydata <- read.csv("brainagedatacleaned20200819.csv")

Organise data

Relevel factors

mydata$SocioStatus <- factor(mydata$SocioStatus, levels = c("Manual", "Non-manual"))
mydata$Smoking <- factor(mydata$Smoking, levels = c("Never smoked", "Ex-smoker", "Current smoker"))
mydata$ApoE4 <- factor(mydata$ApoE4, levels = c("Non-carrier", "Carrier"))
mydata$Education <- factor(mydata$Education, levels = c("None attempted", "Vocational or GCSE", "A-level or higher"))
mydata$Diagnosis <- factor(mydata$Diagnosis)

Recode the snp as a factor

mydata$rs1452628_T <- as.factor(mydata$rs1452628_T)

Create dataset of all cases

mydata <- mydata %>% 
  dplyr::select(-id)
allcases <- mydata  %>%           #Create dataset of all cases regardless of missing data-points, select variables
  dplyr::select(-Diagnosis, -Age_at_blood, -ScanAge)

2 Missing data


Create the dataset of the sample used in the study (mydata5)

dim(mydata)   #Remove 34 participants with missing brain predicted age values
## [1] 502  31
mydata2 <- mydata %>% 
  drop_na(BPA)
dim(mydata2)
## [1] 468  31
mydata3 <- mydata2 %>%   #Remove 8 participants with missing amyloid status
  drop_na(AmyloidStatus)
dim(mydata3)
## [1] 460  31
mydata4 <- mydata3 %>%    #Remove 2 participants with missing ApoE4 status
  drop_na(ApoE4)
dim(mydata4)
## [1] 458  31
mydata5 <- mydata4 %>%    #Remove 2 participants with missing Serum NFL status
  drop_na(SerumNFL)

dim(mydata5)
## [1] 456  31
mydata5 %>%     #Check missingness in the core sample used in the study.
  summarise_all(funs(sum(is.na(.)))) %>% 
  pivot_longer(everything(), names_to="Variable", values_to="NA Count") %>% 
  kable()
Variable NA Count
Sex 0
SocioStatus 0
Education 0
Childcog 0
Smoking 0
MajorBrainDisorder 0
Diagnosis 0
Age 0
ScanAge 0
BPA 0
PAD 0
TIV 0
WBV 0
Ventvol 0
Hippovol 0
WMHVol 0
PACC 0
AmyloidStatus 0
AmyloidSuvr 0
ApoE4 0
PRS 30
rs1452628_T 33
Age_at_blood 0
SerumNFL 0
Tauplasma 3
FHS_36 45
FHS_69 13
FEV1 47
GripStrength 7
WalkSpeed 25
Height 0

Create dataset of participants with complete data in all variables.

Scale continuous variables to facilitate comparisons

mydata5 <- mydata5 %>% 
  mutate(across(c(Age, PAD, WBV, Ventvol, TIV, WMHVol, Hippovol, AmyloidSuvr, SerumNFL, FHS_36, FHS_69, PRS, FEV1, GripStrength, WalkSpeed, Height), scale, .names = "{col}z"))

3 Summary Statistics


Create summary table by total and grouped by sex using qwraps package

options(qwraps2_markup = "markdown", digits = 2)

summary2 <-   #Summary used for table 1 without sex as a variable
  list("Chronological age (years)" =
         list("Range" = ~ paste(frmt(range(.data$Age, na.rm=T), digits=1), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$Age, na_rm=T, digits=1, show_n = "never", denote_sd = "paren")),
       "Brain predicted age (years)" =
         list("Range" = ~ paste(frmt(range(.data$BPA, na.rm=T), digits=1), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$BPA, na_rm=T, digits=1, show_n = "never", denote_sd = "paren")),
       "Brain predicted age difference (years)" =
         list("Range" = ~ paste(frmt(range(.data$PAD, na.rm=T), digits=1), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$PAD, na_rm=T, digits=1, show_n = "never", denote_sd = "paren")),
       "Socioeconomic status" = 
         list("Manual" = ~ qwraps2::n_perc0(.data$SocioStatus == "Manual", na_rm = T, show_symbol = T),
              "Non-manual"= ~ qwraps2::n_perc0(.data$SocioStatus == "Non-manual", na_rm = T, show_symbol = T)),
       "Educational attainment" =
         list("None attempted" = ~ qwraps2::n_perc0(.data$Education == "None attempted", na_rm = T, show_symbol = T),
             "School grade" = ~ qwraps2::n_perc0(.data$Education == "Vocational or GCSE", na_rm = T, show_symbol = T),
             "Higher education" = ~ qwraps2::n_perc0(.data$Education == "A-level or higher", na_rm = T, show_symbol = T)),
       "Childhood cognition (z-score)" = 
         list("Range" = ~ paste(frmt(range(.data$Childcog, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$Childcog, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Smoking" =
         list("Never smoked" = ~ qwraps2::n_perc0(.data$Smoking == "Never smoked", na_rm = T, show_symbol = T),
             "Ex-smoker" = ~ qwraps2::n_perc0(.data$Smoking == "Ex-smoker", na_rm = T, show_symbol = T),
             "Current smoker" = ~ qwraps2::n_perc0(.data$Smoking == "Current smoker", na_rm = T, show_symbol = T)),
       "Major brain disorder" =
         list("None" = ~ qwraps2::n_perc0(.data$MajorBrainDisorder == "None", na_rm = T, show_symbol = T),
              "Present"= ~ qwraps2::n_perc0(.data$MajorBrainDisorder == "Present", na_rm = T, show_symbol = T)),
       "Total intracranial volume (ml)" =
         list("Range" = ~ paste(frmt(range(.data$TIV, na.rm=T), digits=0), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$TIV, na_rm=T, show_n = "never", denote_sd = "paren", digits=0)),
       "Whole brain volume (ml)" =
         list("Range" = ~ paste(frmt(range(.data$WBV, na.rm=T), digits=0), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$WBV, na_rm=T, show_n = "never", denote_sd = "paren", digits=0)),
       "Ventricular volume (ml)" =
         list("Range" = ~ paste(frmt(range(.data$Ventvol, na.rm=T), digits=2), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$Ventvol, na_rm=T, show_n = "never", denote_sd = "paren", digits=2)),
       "Hippocampal volume (ml)" =
         list("Range" = ~ paste(frmt(range(.data$Hippovol, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$Hippovol, na_rm=T, show_n = "never", denote_sd = "paren")),
       "White matter hyperintensity volume (ml)" =
         list("Range" = ~ paste(frmt(range(.data$WMHVol, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$WMHVol, na_rm=T, show_n = "never", denote_sd = "paren")),
       "PACC score (z-score)" =
         list("Number" = ~ length(na.omit(.data$PACC)),
              "Range" = ~ paste(frmt(range(.data$PACC, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$PACC, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Amyloid status" =
         list("Negative" = ~ qwraps2::n_perc0(.data$AmyloidStatus == "Negative", na_rm = T, show_symbol = T),
              "Positive"= ~ qwraps2::n_perc0(.data$AmyloidStatus == "Positive", na_rm = T, show_symbol = T)),
       "Amyloid SUVR" = 
         list("Range" = ~ paste(frmt(range(.data$AmyloidSuvr, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$AmyloidSuvr, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Serum neurofilament light (pg/ml)" = 
         list("Range" = ~ paste(frmt(range(.data$SerumNFL, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$SerumNFL, na_rm=T, show_n = "never", denote_sd = "paren")),
       "APOE ε4 status" =
          list("Non-carrier"= ~ qwraps2::n_perc0(.data$ApoE4 == "Non-carrier", na_rm = T, show_symbol = T),
               "Carrier" = ~ qwraps2::n_perc0(.data$ApoE4 == "Carrier", na_rm = T, show_symbol = T)),
       "Alzheimer's Polygenic Risk Score (z-score)" = 
         list("Number" = ~ length(na.omit(.data$PRS)),
              "Range" = ~ paste(frmt(range(.data$PRS, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$PRS, na_rm=T, show_n = "never", denote_sd = "paren")),
       "rs1452628_T Allele number" =
         list("No copies"= ~ qwraps2::n_perc0(.data$rs1452628_T == "0", na_rm = T, show_symbol = T),
              "1 copy" = ~ qwraps2::n_perc0(.data$rs1452628_T == "1", na_rm = T, show_symbol = T),
              "2 copies" = ~ qwraps2::n_perc0(.data$rs1452628_T == "2", na_rm = T, show_symbol = T)),
       "Framingham Risk Score age 36" =
         list("Number" = ~ length(na.omit(.data$FHS_36)),
              "Range" = ~ paste(frmt(range(.data$FHS_36, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$FHS_36, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Framingham Risk Score age 69" =
         list("Number" = ~ length(na.omit(.data$FHS_69)),
              "Range" = ~ paste(frmt(range(.data$FHS_69, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$FHS_69, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Forced expiratory volume (L)" =
         list("Number" = ~ length(na.omit(.data$FEV1)),
              "Range" = ~ paste(frmt(range(.data$FEV1, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$FEV1, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Grip strength (kg)" =
          list("Number" = ~ length(na.omit(.data$GripStrength)),
              "Range" = ~ paste(frmt(range(.data$GripStrength, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$GripStrength, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Walking speed (m/s)" =
         list("Number" = ~ length(na.omit(.data$WalkSpeed)),
              "Range" = ~ paste(frmt(range(.data$WalkSpeed, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$WalkSpeed, na_rm=T, show_n = "never", denote_sd = "paren")))
by_sex <- summary_table(dplyr::group_by(mydata5, Sex), summary2)
totalbysex <- summary_table(mydata5, summary2)
table1 <- cbind(totalbysex, by_sex)
print(table1, 
      rtitle = "Summary Statistics",
      cnames = c("Total (N=456)", "Female (N=225)", "Male (N=231)"))
## 
## 
## |Summary Statistics                             |Total (N=456) |Female (N=225) |Male (N=231)  |
## |:----------------------------------------------|:-------------|:--------------|:-------------|
## |**Chronological age (years)**                  |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Range                             |69.2, 71.9    |69.3, 71.9     |69.2, 71.8    |
## |&nbsp;&nbsp; Mean (SD)                         |70.7 (0.7)    |70.7 (0.7)     |70.7 (0.7)    |
## |**Brain predicted age (years)**                |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Range                             |46.3, 94.3    |46.3, 85.2     |50.9, 94.3    |
## |&nbsp;&nbsp; Mean (SD)                         |67.9 (8.1)    |65.2 (7.4)     |70.6 (7.9)    |
## |**Brain predicted age difference (years)**     |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Range                             |-24.6, 22.7   |-24.6, 14.7    |-19.9, 22.7   |
## |&nbsp;&nbsp; Mean (SD)                         |-2.8 (8.0)    |-5.5 (7.3)     |-0.1 (7.8)    |
## |**Socioeconomic status**                       |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Manual                            |70 (15%)      |30 (13%)       |40 (17%)      |
## |&nbsp;&nbsp; Non-manual                        |386 (85%)     |195 (87%)      |191 (83%)     |
## |**Educational attainment**                     |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; None attempted                    |70 (15%)      |37 (16%)       |33 (14%)      |
## |&nbsp;&nbsp; School grade                      |139 (30%)     |82 (36%)       |57 (25%)      |
## |&nbsp;&nbsp; Higher education                  |247 (54%)     |106 (47%)      |141 (61%)     |
## |**Childhood cognition (z-score)**              |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Range                             |-1.60, 2.50   |-1.59, 2.47    |-1.60, 2.50   |
## |&nbsp;&nbsp; Mean (SD)                         |0.41 (0.75)   |0.44 (0.74)    |0.38 (0.75)   |
## |**Smoking**                                    |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Never smoked                      |160 (35%)     |86 (38%)       |74 (32%)      |
## |&nbsp;&nbsp; Ex-smoker                         |280 (61%)     |131 (58%)      |149 (65%)     |
## |&nbsp;&nbsp; Current smoker                    |16 (4%)       |8 (4%)         |8 (3%)        |
## |**Major brain disorder**                       |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; None                              |415 (91%)     |207 (92%)      |208 (90%)     |
## |&nbsp;&nbsp; Present                           |41 (9%)       |18 (8%)        |23 (10%)      |
## |**Total intracranial volume (ml)**             |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Range                             |1,114, 1,939  |1,114, 1,558   |1,274, 1,939  |
## |&nbsp;&nbsp; Mean (SD)                         |1,431 (133)   |1,341 (92)     |1,518 (106)   |
## |**Whole brain volume (ml)**                    |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Range                             |819, 1,494    |819, 1,265     |946, 1,494    |
## |&nbsp;&nbsp; Mean (SD)                         |1,099 (99)    |1,045 (82)     |1,151 (86)    |
## |**Ventricular volume (ml)**                    |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Range                             |6.16, 112.00  |6.16, 82.93    |9.33, 112.00  |
## |&nbsp;&nbsp; Mean (SD)                         |30.94 (16.34) |26.43 (14.70)  |35.32 (16.68) |
## |**Hippocampal volume (ml)**                    |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Range                             |4.12, 8.54    |4.12, 7.45     |4.83, 8.54    |
## |&nbsp;&nbsp; Mean (SD)                         |6.26 (0.67)   |6.01 (0.59)    |6.51 (0.65)   |
## |**White matter hyperintensity volume (ml)**    |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Range                             |0.27, 33.67   |0.35, 32.78    |0.27, 33.67   |
## |&nbsp;&nbsp; Mean (SD)                         |5.21 (5.54)   |5.64 (5.90)    |4.80 (5.15)   |
## |**PACC score (z-score)**                       |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |456           |225            |231           |
## |&nbsp;&nbsp; Range                             |-3.49, 1.72   |-3.48, 1.67    |-3.49, 1.72   |
## |&nbsp;&nbsp; Mean (SD)                         |-0.01 (0.74)  |0.16 (0.73)    |-0.17 (0.71)  |
## |**Amyloid status**                             |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Negative                          |373 (82%)     |188 (84%)      |185 (80%)     |
## |&nbsp;&nbsp; Positive                          |83 (18%)      |37 (16%)       |46 (20%)      |
## |**Amyloid SUVR**                               |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Range                             |0.40, 1.27    |0.40, 1.25     |0.40, 1.27    |
## |&nbsp;&nbsp; Mean (SD)                         |0.59 (0.15)   |0.59 (0.14)    |0.60 (0.15)   |
## |**Serum neurofilament light (pg/ml)**          |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Range                             |7.26, 124.00  |7.26, 121.00   |7.39, 124.00  |
## |&nbsp;&nbsp; Mean (SD)                         |20.74 (12.19) |20.95 (10.78)  |20.53 (13.45) |
## |**APOE ε4 status**                             |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Non-carrier                       |325 (71%)     |165 (73%)      |160 (69%)     |
## |&nbsp;&nbsp; Carrier                           |131 (29%)     |60 (27%)       |71 (31%)      |
## |**Alzheimer's Polygenic Risk Score (z-score)** |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |426           |209            |217           |
## |&nbsp;&nbsp; Range                             |-3.15, 2.75   |-2.60, 2.75    |-3.15, 2.14   |
## |&nbsp;&nbsp; Mean (SD)                         |-0.06 (1.01)  |-0.12 (0.98)   |-0.01 (1.04)  |
## |**rs1452628_T Allele number**                  |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; No copies                         |169 (40%)     |88 (42%)       |81 (38%)      |
## |&nbsp;&nbsp; 1 copy                            |195 (46%)     |95 (45%)       |100 (47%)     |
## |&nbsp;&nbsp; 2 copies                          |59 (14%)      |27 (13%)       |32 (15%)      |
## |**Framingham Risk Score age 36**               |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |411           |203            |208           |
## |&nbsp;&nbsp; Range                             |0.58, 11.25   |0.58, 5.29     |1.69, 11.25   |
## |&nbsp;&nbsp; Mean (SD)                         |2.90 (1.74)   |1.72 (0.79)    |4.05 (1.65)   |
## |**Framingham Risk Score age 69**               |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |443           |216            |227           |
## |&nbsp;&nbsp; Range                             |2.53, 68.75   |2.53, 62.95    |14.46, 68.75  |
## |&nbsp;&nbsp; Mean (SD)                         |25.90 (13.45) |16.66 (9.20)   |34.69 (10.68) |
## |**Forced expiratory volume (L)**               |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |409           |208            |201           |
## |&nbsp;&nbsp; Range                             |0.37, 4.84    |0.84, 3.76     |0.37, 4.84    |
## |&nbsp;&nbsp; Mean (SD)                         |2.71 (0.68)   |2.26 (0.42)    |3.18 (0.56)   |
## |**Grip strength (kg)**                         |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |449           |220            |229           |
## |&nbsp;&nbsp; Range                             |11.00, 61.50  |11.00, 43.80   |14.80, 61.50  |
## |&nbsp;&nbsp; Mean (SD)                         |32.99 (10.90) |24.48 (5.59)   |41.16 (8.16)  |
## |**Walking speed (m/s)**                        |&nbsp;&nbsp;  |&nbsp;&nbsp;   |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |431           |209            |222           |
## |&nbsp;&nbsp; Range                             |0.57, 2.22    |0.57, 2.22     |0.57, 1.99    |
## |&nbsp;&nbsp; Mean (SD)                         |1.08 (0.26)   |1.06 (0.26)    |1.11 (0.26)   |


#### Create plots of age, BPA and sex differences

Summary of major brain disorders

kable(summary(as.factor(mydata5$Diagnosis)))
x
415
Alzheimer’s Disease 2
Alzheimer’s Disease (diagnosed by CL) 1
Bipolar Disorder 2
Brain metastasis 1
Clinical stroke 4
Clinical stroke and radiological cortical stroke 1
Clinical stroke and radiological cortical stroke 2
Depression requiring ECT 2
Epilepsy 5
Epilepsy 1
Hepatic encephalopathy prior to liver transplant (liver cirrhosis secondary to NASH) 1
Multiple Sclerosis 1
Multiple Sclerosis 1
Myotonic dystrophy 1
Parkinson’s Disease 2
Parkinson’s Disease & Epilepsy 1
Radiological cortical stroke 9
Radiological cortical stroke (haemorrhage) 1
Radiological MS 1
Subdurals requiring neurosurgery 1
TBI 1


Relationship between age and brain predicted age



(sumstatsgraph <- ggarrange(age_density, sex_histogram, 
                              ncol=1, nrow=2,
                              labels = "AUTO"))

4 Create model of all variables to check overall variance explained

overalllm <- lm(PAD ~ Agez + Sex + Childcog + Education + SocioStatus + Smoking + TIVz  + WBVz + Ventvolz + Hippovolz + WMHVolz + PACC + AmyloidSuvrz + ApoE4 + PRS + rs1452628_T + SerumNFLz + FHS_36z + FHS_69z + MajorBrainDisorder + FEV1z + GripStrengthz + WalkSpeedz + Heightz, mydata5)
(summ(overalllm, confint = T))
Observations 308 (148 missing obs. deleted)
Dependent variable PAD
Type OLS linear regression
F(27,280) 6.15
R² 0.37
Adj. R² 0.31
Est. 2.5% 97.5% t val. p
(Intercept) -0.96 -4.94 3.02 -0.47 0.64
Agez 0.84 0.02 1.66 2.01 0.05
Sexmale -0.46 -4.29 3.37 -0.24 0.81
Childcog 0.39 -0.88 1.67 0.60 0.55
EducationVocational or GCSE -2.03 -4.72 0.66 -1.49 0.14
EducationA-level or higher -2.18 -4.97 0.61 -1.54 0.13
SocioStatusNon-manual 1.22 -1.29 3.72 0.96 0.34
SmokingEx-smoker -1.05 -2.80 0.69 -1.19 0.24
SmokingCurrent smoker 0.64 -4.80 6.08 0.23 0.82
TIVz 6.34 3.97 8.70 5.28 0.00
WBVz -3.90 -5.93 -1.87 -3.78 0.00
Ventvolz -0.73 -1.81 0.35 -1.34 0.18
Hippovolz 0.92 -0.10 1.95 1.77 0.08
WMHVolz 2.00 1.18 2.83 4.79 0.00
PACC -0.22 -1.56 1.12 -0.33 0.75
AmyloidSuvrz 0.23 -0.68 1.14 0.50 0.61
ApoE4Carrier 0.06 -1.85 1.96 0.06 0.95
PRS -0.40 -1.19 0.38 -1.01 0.31
rs1452628_T1 -1.15 -2.89 0.58 -1.31 0.19
rs1452628_T2 -0.46 -3.01 2.08 -0.36 0.72
SerumNFLz 1.33 0.57 2.10 3.44 0.00
FHS_36z 0.64 -0.51 1.79 1.09 0.28
FHS_69z 0.21 -1.01 1.44 0.34 0.73
MajorBrainDisorderPresent 2.40 -0.49 5.29 1.64 0.10
FEV1z 0.27 -0.99 1.54 0.43 0.67
GripStrengthz -0.10 -1.40 1.19 -0.16 0.88
WalkSpeedz -0.25 -1.07 0.57 -0.60 0.55
Heightz 0.35 -1.13 1.82 0.46 0.64
Standard errors: OLS

5 Early lifecourse and demographic contributors to brain age

Chronological age

agelm <- lm(PAD ~ Age, data=mydata5)

summ(agelm, robust="HC1", digits = 1,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(1,454) 6.5
R² 0.0
Adj. R² 0.0
Est. 2.5% 97.5% t val. p
(Intercept) -103.1 -175.9 -30.2 -2.8 0.0
Age 1.4 0.4 2.5 2.7 0.0
Standard errors: Robust, type = HC1
plot(agelm)  #check linearity assumptions

Sex

sexlm <- lm(PAD ~ Sex + Age, data=mydata5) 
summ(sexlm, digits = 3,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(2,453) 34.116
R² 0.131
Adj. R² 0.127
Est. 2.5% 97.5% t val. p
(Intercept) -112.074 -184.911 -39.238 -3.024 0.003
Sexmale 5.491 4.109 6.874 7.804 0.000
Age 1.507 0.477 2.538 2.875 0.004
Standard errors: OLS
plot(sexlm)  #check linearity assumptions

coefssex <-  tidy(sexlm , conf.int = TRUE)  #modify estimate and confidence intervals for figure display
coefssex <- coefssex %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefssex$estimate, coefssex$conf.low, coefssex$conf.high )) %>% 
  dplyr::filter(term=="Sexmale")

Educational attainment

educationlm <- lm(PAD ~ Education + Sex + Age, data=mydata5)
summ(educationlm, robust="HC1", digits = 1,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(4,451) 17.3
R² 0.1
Adj. R² 0.1
Est. 2.5% 97.5% t val. p
(Intercept) -113.2 -181.5 -45.0 -3.3 0.0
EducationVocational or GCSE 1.1 -1.2 3.3 0.9 0.3
EducationA-level or higher 0.9 -1.2 2.9 0.8 0.4
Sexmale 5.5 4.1 6.9 7.6 0.0
Age 1.5 0.5 2.5 3.1 0.0
Standard errors: Robust, type = HC1
plot(educationlm)  #check linearity assumptions

coefsedu <-  tidy(educationlm , conf.int = TRUE)  #modify estimate and confidence intervals for graphical display
coefsedu <- coefsedu %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsedu$estimate, coefsedu$conf.low, coefsedu$conf.high )) %>% 
    dplyr::filter(term=="EducationVocational or GCSE" | term== "EducationA-level or higher") 

Socioeconomic status

sociolm <- lm(PAD ~ SocioStatus + Sex + Age, data=mydata5)
summ(sociolm, robust="HC1", digits = 1,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(3,452) 24.1
R² 0.1
Adj. R² 0.1
Est. 2.5% 97.5% t val. p
(Intercept) -115.4 -183.4 -47.4 -3.3 0.0
SocioStatusNon-manual 1.9 -0.1 3.8 1.9 0.1
Sexmale 5.6 4.2 6.9 7.9 0.0
Age 1.5 0.6 2.5 3.1 0.0
Standard errors: Robust, type = HC1
plot(sociolm)  #check linearity assumptions

coefssocio <-  tidy(sociolm , conf.int = TRUE)  #modify estimate and confidence intervals for graphical display
coefssocio <- coefssocio %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefssocio$estimate, coefssocio$conf.low, coefssocio$conf.high )) %>% 
  dplyr::filter(term=="SocioStatusNon-manual")

Childhood cognition (IQ)

childcoglm <- lm(PAD ~ Childcog + Sex + Age, data=mydata5)
summ(childcoglm, robust="HC1", digits = 1,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(3,452) 23.7
R² 0.1
Adj. R² 0.1
Est. 2.5% 97.5% t val. p
(Intercept) -108.5 -176.0 -41.1 -3.2 0.0
Childcog 0.8 -0.1 1.6 1.7 0.1
Sexmale 5.5 4.2 6.9 7.9 0.0
Age 1.5 0.5 2.4 3.0 0.0
Standard errors: Robust, type = HC1
plot(childcoglm)  #check linearity assumptions

coefschildcog <-  tidy(childcoglm , conf.int = TRUE)  #modify estimate and confidence intervals for graphical display
coefschildcog <- coefschildcog %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefschildcog$estimate, coefschildcog$conf.low, coefschildcog$conf.high )) %>% 
  dplyr::filter(term=="Childcog")

Modify coeficients for graphical presentation

coefsel <- rbind(coefssex,  coefschildcog, coefsedu, coefssocio)

# Add nicer names
coefsel$names <- factor(c( "Male", "Childhood IQ (z score)", 
                 "Vocational or GCSE", "A level or higher", "Non-manual social class"), 
                 levels = c("Male", "Childhood IQ (z score)", 
                 "Vocational or GCSE", "A level or higher", "Non-manual social class"))

coefsel$type = factor(c("Sex",
               "Childhood cognition",
               rep("Education level (reference: none attempted)", 2),
               "Socioeconomic Status (reference: manual social class)"), 
               levels = c("Sex", "Childhood cognition", "Education level (reference: none attempted)",
               "Socioeconomic Status (reference: manual social class)"))

6 Midlife contributions to brain age - cardiovascular risk (FHS) at 36 and 69

FHS at age 36

FHS36lm <- lm(PAD ~  FHS_36z + SocioStatus, data=mydata5)
summ(FHS36lm, robust="HC1", digits = 4,
            confint=T)
Observations 411 (45 missing obs. deleted)
Dependent variable PAD
Type OLS linear regression
F(2,408) 19.1344
R² 0.0858
Adj. R² 0.0813
Est. 2.5% 97.5% t val. p
(Intercept) -3.7732 -5.6058 -1.9407 -4.0476 0.0001
FHS_36z 2.3554 1.5960 3.1148 6.0974 0.0000
SocioStatusNon-manual 1.3944 -0.6218 3.4106 1.3596 0.1747
Standard errors: Robust, type = HC1
plot(FHS36lm)

Scatterplot with FHS 36



FHS age 69


FHS69lm <- lm(PAD ~  FHS_69z + SocioStatus, data=mydata5)

summ(FHS69lm, robust="HC1", digits = 4,
            confint=T)
Observations 443 (13 missing obs. deleted)
Dependent variable PAD
Type OLS linear regression
F(2,440) 28.0354
R² 0.1130
Adj. R² 0.1090
Est. 2.5% 97.5% t val. p
(Intercept) -4.2313 -6.0351 -2.4275 -4.6103 0.0000
FHS_69z 2.6297 1.9945 3.2649 8.1369 0.0000
SocioStatusNon-manual 1.7078 -0.2519 3.6675 1.7128 0.0875
Standard errors: Robust, type = HC1
plot(FHS69lm)  # Check linearity assumptions

Scatter plot of FHS 69

Combining coefficients for presentation

coefs36 <-  tidy(FHS36lm , conf.int = TRUE)   #modify estimate and confidence intervals for graphical display
coefs36 <- coefs36 %>% 
  dplyr::filter(term=="FHS_36z")
coefs36 <- coefs36 %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefs36$estimate, coefs36$conf.low, coefs36$conf.high ))
coefs69 <-  tidy(FHS69lm , conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefs69 <- coefs69 %>% 
  dplyr::filter(term=="FHS_69z") 
coefs69 <- coefs69 %>% 
  dplyr::mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefs69$estimate, coefs69$conf.low, coefs69$conf.high ))
coefsFHS <- dplyr::union(coefs36, coefs69)  #Create table of coefficients for graphical display
# Add nicer names
coefsFHS$names <- factor(c("FRS age 36 (z score)", "FRS age 69 (z score)"), levels = c("FRS age 69 (z score)", "FRS age 36 (z score)"))
# Group the variables 
coefsFHS$type = rep("Cardiovascular Risk", 2)

Compare early life and mid life factors contributing to brain age with a Williams test

earlymidcomparedata <- na.omit(mydata5, cols=seq_along(c(childcog, FHS36)))
dim(earlymidcomparedata)
## [1] 305  47
# Create stepwise correlations of the 3 variables
cor12 <- cor.test(earlymidcomparedata$PAD, earlymidcomparedata$FHS_36z)$estimate
cor13 <- cor.test(earlymidcomparedata$PAD, earlymidcomparedata$Childcog)$estimate
cor23 <- cor.test(earlymidcomparedata$Childcog, earlymidcomparedata$FHS_36z)$estimate

psych::r.test(n = 305, r12=cor12, r13=cor13, r23=cor23) #Apply the williams test
## Correlation tests 
## Call:[1] "r.test(n =  305 ,  r12 =  0.290733030424664 ,  r23 =  -0.0474120507613991 ,  r13 =  0.0226692971450102 )"
## Test of difference between two correlated  correlations 
##  t value 3.3    with probability < 0.00094

7 Contemporary correlate of brain age: Imaging, genetic/blood biomarker and physical factors

Imaging findings

Whole brain volume

imagingWBV <- lm(PAD ~ WBVz + TIVz + Sex + Age, data=mydata5)
summ(imagingWBV, robust="HC1", scale =T, digits = 4,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(4,451) 35.8368
R² 0.2412
Adj. R² 0.2345
Est. 2.5% 97.5% t val. p
(Intercept) -3.1960 -4.2892 -2.1028 -5.7453 0.0000
WBVz -3.5426 -5.0164 -2.0687 -4.7236 0.0000
TIVz 6.3078 4.6152 8.0003 7.3242 0.0000
Sexmale 0.8362 -0.8953 2.5677 0.9491 0.3431
Age 0.6118 -0.0225 1.2460 1.8956 0.0586
Standard errors: Robust, type = HC1; Continuous predictors are mean-centered and scaled by 1 s.d.
#Check linearity assumptions
plot(imagingWBV)

coefswbv <-  tidy(imagingWBV , conf.int = TRUE)  #modify estimate and confidence intervals for graphical display
coefswbv <- coefswbv %>% 
  dplyr::filter(term=="WBVz") 
coefswbv <- coefswbv %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefswbv$estimate, coefswbv$conf.low, coefswbv$conf.high ))

Hippocampal volume

imaginghippo <- lm(PAD ~ Hippovolz + Sex + TIVz + Age, data=mydata5)

summ(imaginghippo, robust="HC1", scale =T, digits = 4,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(4,451) 28.6347
R² 0.2025
Adj. R² 0.1955
Est. 2.5% 97.5% t val. p
(Intercept) -3.6006 -4.7275 -2.4736 -6.2789 0.0000
Hippovolz 0.1046 -0.7306 0.9397 0.2460 0.8058
Sexmale 1.6348 -0.1601 3.4297 1.7899 0.0741
TIVz 2.8369 1.8085 3.8653 5.4213 0.0000
Age 0.8989 0.2631 1.5346 2.7786 0.0057
Standard errors: Robust, type = HC1; Continuous predictors are mean-centered and scaled by 1 s.d.
plot(imaginghippo) # check linearity assumptions

coefshippo <-  tidy(imaginghippo , conf.int = TRUE)   #modify estimate and confidence intervals for graphical display

coefshippo <- coefshippo %>%
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefshippo$estimate, coefshippo$conf.low, coefshippo$conf.high )) %>% 
  dplyr::filter(term=="Hippovolz")

Ventricular volume

Observations 456
Dependent variable PAD
Type OLS linear regression
F(4,451) 28.8835
R² 0.2039
Adj. R² 0.1969
Est. 2.5% 97.5% t val. p
(Intercept) -3.6218 -4.7462 -2.4974 -6.3301 0.0000
Ventvolz 0.3520 -0.5044 1.2084 0.8077 0.4197
TIVz 2.7190 1.6648 3.7732 5.0686 0.0000
Sexmale 1.6768 -0.1097 3.4632 1.8446 0.0658
Age 0.8685 0.2408 1.4961 2.7193 0.0068
Standard errors: Robust, type = HC1; Continuous predictors are mean-centered and scaled by 1 s.d.
plot(imagingvent)


coefsvent <-  tidy(imagingvent , conf.int = TRUE)   #modify estimate and confidence intervals for graphical display
coefsvent <- coefsvent %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsvent$estimate, coefsvent$conf.low, coefsvent$conf.high )) %>% 
  dplyr::filter(term=="Ventvolz")

Imaging WMH

imagingwmh <- lm(PAD ~ WMHVolz + TIVz + Sex + Age, data=mydata5)
summ(imagingwmh, robust="HC1", scale =T, digits = 4,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(4,451) 38.7523
R² 0.2558
Adj. R² 0.2492
Est. 2.5% 97.5% t val. p
(Intercept) -3.9005 -5.0098 -2.7912 -6.9103 0.0000
WMHVolz 1.8782 1.2843 2.4720 6.2154 0.0000
TIVz 2.6585 1.6830 3.6340 5.3558 0.0000
Sexmale 2.2269 0.4630 3.9908 2.4811 0.0135
Age 0.7279 0.1167 1.3390 2.3406 0.0197
Standard errors: Robust, type = HC1; Continuous predictors are mean-centered and scaled by 1 s.d.
plot(imagingwmh)


coefsWMH <-  tidy(imagingwmh, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefsWMH <- coefsWMH %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsWMH$estimate, coefsWMH$conf.low, coefsWMH$conf.high )) %>% 
  dplyr::filter(term=="WMHVolz")

Combine results of brain imaging models for graphical display

coefsimaging <- rbind(coefswbv, coefshippo, coefsvent, coefsWMH)
# Add nicer names
coefsimaging$names <- factor(c( "Whole brain (z score)", "Hippocampi (z score)", "Ventricles (z score)", "WMH (z score)"), levels = c("WMH (z score)", "Ventricles (z score)", "Hippocampi (z score)", "Whole brain (z score)"))
# Group the variables 
coefsimaging$type = rep("MR Imaging volumes", 4)

WMH scatter plot

Biomarkers

NFL

NFLlm <- lm(PAD ~ SerumNFLz + Sex + Age, data = mydata5)
summNFL <- summ(NFLlm, robust="HC1", digits = 4,
            confint=T)
summNFL
Observations 456
Dependent variable PAD
Type OLS linear regression
F(3,452) 27.5979
R² 0.1548
Adj. R² 0.1492
Est. 2.5% 97.5% t val. p
(Intercept) -106.4076 -174.2287 -38.5864 -3.0833 0.0022
SerumNFLz 1.2443 0.5912 1.8974 3.7441 0.0002
Sexmale 5.5320 4.1670 6.8969 7.9647 0.0000
Age 1.4268 0.4670 2.3867 2.9214 0.0037
Standard errors: Robust, type = HC1
coefsNFL <-  tidy(NFLlm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefsNFL <- coefsNFL %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsNFL$estimate, coefsNFL$conf.low, coefsNFL$conf.high )) %>% 
  dplyr::filter(term=="SerumNFLz")
plot(NFLlm)  #check linearity assumptions


#ggsave("Figures/NFLscatter75.png",  bpa_NFL_scatter, height=10, width=18, units="cm" )

NFL removing outliers

#Identidy NFL outliers by Tukey's Fences
NFLoutliercutoff <- summary(mydata5$SerumNFL)[["3rd Qu."]] + 1.5*IQR(mydata5$SerumNFL)
# Create subset of participants who are outliers to compare to remainder of cohort
NFLoutliers <- mydata5 %>% 
  filter(mydata5$SerumNFL > NFLoutliercutoff)

Scatterplot with NFL

Fibrillar amyloid beta: Continuous (SUVR) and discrete (amyloid) amyloid beta measurement

Continuous amyloid measurement (SUVR) scatterplot

(bpa_amyloid_scatter <- ggplot(mydata5, aes(x = AmyloidSuvr, y = BPA)) +
    geom_smooth(method = 'lm', colour = "black", size=0.4, fill = "grey75") +
    geom_point( size = 1, alpha = 0.7) +
    theme_bw() +
   stat_cor(method = "pearson", label.x.npc = 0.68, label.y.npc = 0) +
    labs(x = "Amyloid SUVR", y = "Brain Predicted Age (years)") +
    theme_bw() +
    theme(panel.grid.major = element_line(colour = "black", size = 0.08),
          panel.grid.minor = element_blank(),
          strip.background = element_blank(),
          strip.text = element_text(size = 12),
          axis.text = element_text(size = 12),
          axis.title = element_text(size = 12),
          legend.text = element_text(size = 12),
          legend.title = element_text(size = 12)))

Discrete amyloid measurement: amyloid positive verse negative

(bpa_amyloid_box <- ggplot(mydata5, aes(x=AmyloidStatus, y=BPA)) +
  geom_boxplot()) +
  geom_jitter(size = 0.7, alpha=0.5, colour="grey30" )

Continuous amyloid regression model

suvrlm <- lm(PAD ~ AmyloidSuvrz + Sex + Age, data = mydata5)

summ(suvrlm, robust="HC1", digits = 4,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(3,452) 24.5233
R² 0.1400
Adj. R² 0.1343
Est. 2.5% 97.5% t val. p
(Intercept) -109.7892 -177.4040 -42.1744 -3.1910 0.0015
AmyloidSuvrz 0.7672 0.0517 1.4827 2.1072 0.0356
Sexmale 5.4078 4.0218 6.7938 7.6679 0.0000
Age 1.4756 0.5188 2.4323 3.0309 0.0026
Standard errors: Robust, type = HC1
plot(suvrlm)

Discrete amyloid regression model

amyloidlm <- lm(PAD ~ AmyloidStatus + Sex + Age, data = mydata5)

summ(amyloidlm, robust="HC1", digits = 4,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(3,452) 23.0516
R² 0.1327
Adj. R² 0.1269
Est. 2.5% 97.5% t val. p
(Intercept) -112.4930 -180.3695 -44.6165 -3.2570 0.0012
AmyloidStatusPositive 0.8813 -0.9487 2.7112 0.9464 0.3445
Sexmale 5.4609 4.0735 6.8484 7.7351 0.0000
Age 1.5112 0.5508 2.4716 3.0922 0.0021
Standard errors: Robust, type = HC1
plot(amyloidlm)

coefssuvr <-  tidy(suvrlm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefssuvr <- coefssuvr %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefssuvr$estimate, coefssuvr$conf.low, coefssuvr$conf.high )) %>% 
  dplyr::filter(term=="AmyloidSuvrz")
coefsbiomarker <- rbind(coefsNFL, coefssuvr)

# Add nicer names and variable types
coefsbiomarker$names <- c( "Serum NFL (z score)", "Florbetapir SUVR (z score)")
coefsbiomarker$type = rep("Blood and Imaging Biomarkers", 2)

Genetics

APOE

apoe4lm <- lm(PAD ~ ApoE4, data = mydata5)

summ(apoe4lm, robust="HC1", digits = 4,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(1,454) 0.5595
R² 0.0012
Adj. R² -0.0010
Est. 2.5% 97.5% t val. p
(Intercept) -2.9513 -3.8179 -2.0846 -6.6924 0.0000
ApoE4Carrier 0.6226 -1.0406 2.2858 0.7356 0.4623
Standard errors: Robust, type = HC1
anovaapo <- anova(apoe4lm)
anovaapo
plot(apoe4lm)  # Check linearity assumptions

coefsapoe <-  tidy(apoe4lm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefsapoe <- coefsapoe %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsapoe$estimate, coefsapoe$conf.low, coefsapoe$conf.high )) %>% 
  dplyr::filter(term !="(Intercept)")

Brain age SNP

snplm <- lm(PAD ~ rs1452628_T, data = mydata5)

summ(snplm, robust="HC1", digits = 4,
            confint=T)
Observations 423 (33 missing obs. deleted)
Dependent variable PAD
Type OLS linear regression
F(2,420) 0.0863
R² 0.0004
Adj. R² -0.0043
Est. 2.5% 97.5% t val. p
(Intercept) -2.6770 -3.8654 -1.4886 -4.4279 0.0000
rs1452628_T1 -0.1522 -1.8147 1.5102 -0.1800 0.8573
rs1452628_T2 0.3450 -2.0848 2.7748 0.2791 0.7803
Standard errors: Robust, type = HC1
anova(snplm)
plot(snplm) #Check linearity assumptions

coefssnp <-  tidy(snplm, conf.int = TRUE)   #modify estimate and confidence intervals for graphical display
coefssnp <- coefssnp %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefssnp$estimate, coefssnp$conf.low, coefssnp$conf.high )) %>% 
  dplyr::filter(term !="(Intercept)")

Polygenic risk score for Alzheimer’s Disease

PRSlm <- lm(PAD ~ PRS, data = mydata5)

summ(PRSlm, robust="HC1", digits = 4,
            confint=T)
Observations 426 (30 missing obs. deleted)
Dependent variable PAD
Type OLS linear regression
F(1,424) 0.4445
R² 0.0010
Adj. R² -0.0013
Est. 2.5% 97.5% t val. p
(Intercept) -2.8165 -3.5886 -2.0443 -7.1694 0.0000
PRS -0.2584 -1.0181 0.5014 -0.6684 0.5043
Standard errors: Robust, type = HC1
anova(PRSlm)
plot(PRSlm)  # Check linearity assumptions

coefsPRS <-  tidy(PRSlm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefsPRS <- coefsPRS %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsPRS$estimate, coefsPRS$conf.low, coefsPRS$conf.high )) %>% 
  dplyr::filter(term !="(Intercept)")

Combine genetic results for graphical display

coefsgenetics <- rbind(coefssnp, coefsPRS, coefsapoe)
coefsgenetics
# Add nicer names and variable types
coefsgenetics$names <- c("rs1452628_T heterozygote", "rs1452628_T homozygote",  "AD Polygenic risk score (z score)", "APOE ε4 carrier")
coefsgenetics$type = rep("Genetics", 4)

Cognition

Cognition Scatterplot

Covariates chosen as those that have shown to contribute to PACC

coglm <- lm(PAD ~ PACC + Sex + Education + Childcog + SocioStatus + Age, data = mydata5)

summ(coglm, robust="HC1", digits = 4,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(7,448) 11.2724
R² 0.1498
Adj. R² 0.1365
Est. 2.5% 97.5% t val. p
(Intercept) -110.3641 -178.3490 -42.3793 -3.1904 0.0015
PACC -1.1598 -2.3012 -0.0184 -1.9970 0.0464
Sexmale 5.3030 3.8465 6.7595 7.1554 0.0000
EducationVocational or GCSE 0.4855 -1.9460 2.9170 0.3924 0.6949
EducationA-level or higher 0.0460 -2.4656 2.5575 0.0360 0.9713
Childcog 0.9909 -0.0242 2.0060 1.9184 0.0557
SocioStatusNon-manual 1.8943 -0.3444 4.1330 1.6629 0.0970
Age 1.4535 0.4932 2.4138 2.9745 0.0031
Standard errors: Robust, type = HC1
anova(coglm)
plot(coglm)  #check linearity assumptions

coefscog <-  tidy(coglm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefscog <- coefscog %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefscog$estimate, coefscog$conf.low, coefscog$conf.high )) %>% 
  dplyr::filter(term =="PACC")
coefscog$names <- c( "PACC (z score)")
coefscog$type = rep("Cognition", 1)

Comorbidities - major brain disorders

(bdisorderbox <- ggplot(mydata5, aes(x=MajorBrainDisorder, y=BPA)) +
  geom_boxplot() +
  geom_jitter(size = 0.7, alpha=0.5, colour="grey30" ) +
   labs(x = "Major Brain Disorder", y = "Brain Predicted Age (years)") +
    theme(panel.grid.major = element_line(colour = "black", size = 0.08),
          panel.grid.minor = element_blank(),
          strip.background = element_blank(),
          strip.text = element_text(size = 12),
          axis.text = element_text(size = 12),
          axis.title = element_text(size = 12),
          legend.text = element_text(size = 12),
          legend.title = element_text(size = 12)))

bdisorderlm <- lm(PAD ~ MajorBrainDisorder + Age + Sex, data = mydata5)

summ(bdisorderlm, robust="HC1", digits = 4,
     confit = T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(3,452) 24.7215
R² 0.1410
Adj. R² 0.1353
Est. S.E. t val. p
(Intercept) -113.6355 34.6425 -3.2802 0.0011
MajorBrainDisorderPresent 2.8157 1.2200 2.3079 0.0215
Age 1.5262 0.4903 3.1127 0.0020
Sexmale 5.4368 0.6999 7.7679 0.0000
Standard errors: Robust, type = HC1
plot(bdisorderlm)

coefsdisorder <-  tidy(bdisorderlm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefsdisorder <- coefsdisorder %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsdisorder$estimate, coefsdisorder$conf.low, coefsdisorder$conf.high )) %>% 
  dplyr::filter(term =="MajorBrainDisorderPresent")
coefsdisorder$names <- c( "Major brain disorder present")
coefsdisorder$type = rep("Comorbidities", 1)

Physical attributes regression

FEV1

FEV1lm <- lm(PAD ~ FEV1z + Smoking + Heightz +Age + Sex, data = mydata5)

summ(FEV1lm, robust="HC1", digits = 4,
            confint=T)
Observations 409 (47 missing obs. deleted)
Dependent variable PAD
Type OLS linear regression
F(6,402) 10.1828
R² 0.1319
Adj. R² 0.1190
Est. 2.5% 97.5% t val. p
(Intercept) -131.7897 -204.5604 -59.0190 -3.5603 0.0004
FEV1z 0.2129 -0.9914 1.4173 0.3475 0.7284
SmokingEx-smoker 0.2252 -1.3832 1.8335 0.2753 0.7833
SmokingCurrent smoker 2.8979 -0.2650 6.0608 1.8012 0.0724
Heightz 0.4906 -0.7747 1.7559 0.7622 0.4464
Age 1.7911 0.7586 2.8236 3.4102 0.0007
Sexmale 4.2837 1.8558 6.7115 3.4686 0.0006
Standard errors: Robust, type = HC1
plot(FEV1lm)  # Check linearity assumptions

coefsFEV1 <-  tidy(FEV1lm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefsFEV1 <- coefsFEV1 %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsFEV1$estimate, coefsFEV1$conf.low, coefsFEV1$conf.high )) %>%
  dplyr::filter(term == "FEV1z")

Grip strength

griplm <- lm(PAD ~ GripStrengthz + Sex + Age, data = mydata5)

summ(griplm, robust="HC1", digits = 4,
            confint=T)
Observations 449 (7 missing obs. deleted)
Dependent variable PAD
Type OLS linear regression
F(3,445) 21.9741
R² 0.1290
Adj. R² 0.1232
Est. 2.5% 97.5% t val. p
(Intercept) -115.3076 -184.2102 -46.4051 -3.2889 0.0011
GripStrengthz -0.2095 -1.2726 0.8535 -0.3873 0.6987
Sexmale 5.7337 3.6188 7.8486 5.3281 0.0000
Age 1.5517 0.5762 2.5273 3.1260 0.0019
Standard errors: Robust, type = HC1
plot(griplm)  # Check linearity assumptions

coefsgrip <-  tidy(griplm, conf.int = TRUE)   #modify estimate and confidence intervals for graphical display
coefsgrip <- coefsgrip %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsgrip$estimate, coefsgrip$conf.low, coefsgrip$conf.high )) %>%
  dplyr::filter(term == "GripStrengthz")

Walking speed

walklm <- lm(PAD ~ WalkSpeedz  + Heightz + Sex + Age, data = mydata5)

summ(walklm, robust="HC1", digits = 4,
            confint=T)
Observations 431 (25 missing obs. deleted)
Dependent variable PAD
Type OLS linear regression
F(4,426) 16.5566
R² 0.1345
Adj. R² 0.1264
Est. 2.5% 97.5% t val. p
(Intercept) -115.4963 -187.4414 -43.5512 -3.1554 0.0017
WalkSpeedz -0.0729 -0.7535 0.6077 -0.2105 0.8334
Heightz 0.3201 -0.6916 1.3318 0.6219 0.5344
Sexmale 5.1689 3.1121 7.2258 4.9396 0.0000
Age 1.5579 0.5383 2.5774 3.0034 0.0028
Standard errors: Robust, type = HC1
plot(walklm) # Check linearity assumptions

coefswalk <-  tidy(walklm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefswalk <- coefswalk %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefswalk$estimate, coefswalk$conf.low, coefswalk$conf.high )) %>%
  dplyr::filter(term == "WalkSpeedz")

Combine physical attributes for graphical display

coefsphysical <- rbind(coefsFEV1, coefsgrip, coefswalk)

# Add nicer names and variable types
coefsphysical$names <- c("FEV1 (z score)", "Grip strength (z score)",  "Walking speed (z score)")
coefsphysical$type = rep("Physical metrics", 3)

8 Combined Scatterplots and boxplots


# 9 Combined forest plots

Combine model results to allow for creation of overall forest plots.

fullcoefsassoc <- rbind(coefsbiomarker, coefsgenetics, coefscog, coefsdisorder, coefsphysical, coefsel, coefsFHS, coefsimaging)
fullcoefsassoc$type <- factor(fullcoefsassoc$type, levels=c("Sex", "Childhood cognition", "Education level (reference: none attempted)", "Socioeconomic Status (reference: manual social class)", "Cardiovascular Risk", "Genetics", "Blood and Imaging Biomarkers", "Cognition", "Comorbidities", "Physical metrics", "MR Imaging volumes"))
fullcoefsassoc$names <- fct_relevel(fullcoefsassoc$names, "A level or higher", "Florbetapir SUVR (z score)", "rs1452628_T homozygote", "rs1452628_T heterozygote", "WMH (z score)", "Hippocampi (z score)", "Ventricles (z score)", "Walking speed (z score)", "Grip strength (z score)") 
(fullassocgraph <- ggplot(fullcoefsassoc, aes(estimate, names )) + 
  geom_point(aes(), size=0.9)+ 
  geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), height = 0, size = 0.4)+
  geom_text(aes(x = Inf, label = display_ests), vjust = 0.5, colour = "black", hjust = -0.1, size = 3.5) +
  coord_cartesian(clip = "off") +
  geom_vline(xintercept = 0, linetype = 2)+
  theme_bw(base_size = 12)+
  theme(plot.margin = unit(c(1,4,0.5,0.5), "cm")) +
   theme(panel.border = element_rect(fill = NA, colour="black", size = 0.33)) +
  labs(x =  NULL,y = NULL, title = NULL)+
   facet_col(~type, scale = "free_y", space = "free") +
   theme(strip.background = element_rect(fill="grey85", colour="black")))  

#ggsave("Figures/combinedgraph17.png", plot=fullassocgraph, height=7.5, width = 7.5)

10 Supplementary Material

Appendix 1 - summary data of those in the sample compared to the whole Insight 46 cohort and those participants with complete data

Create summary table outline used in the appendix

summary1 <-   #Summary outline for use in the appendix
  list("Chronological age (years)" =
         list("Number" = ~ length(na.omit(.data$Age)),
              "Range" = ~ paste(frmt(range(.data$Age, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$Age, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Brain predicted age (years)" =
         list("Number" = ~ length(na.omit(.data$BPA)),
              "Range" = ~ paste(frmt(range(.data$BPA, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$BPA, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Brain predicted age difference (years)" =
         list("Number" = ~ length(na.omit(.data$PAD)),
              "Range" = ~ paste(frmt(range(.data$PAD, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$PAD, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Sex" = 
         list("Female" = ~ qwraps2::n_perc0(.data$Sex == "female", na_rm = T, show_symbol = T)),
       "Socioeconomic status" = 
         list("Manual" = ~ qwraps2::n_perc0(.data$SocioStatus == "Manual", na_rm = T, show_symbol = T),
              "Non-manual"= ~ qwraps2::n_perc0(.data$SocioStatus == "Non-manual", na_rm = T, show_symbol = T)),
       "Educational attainment" =
         list("None attempted" = ~ qwraps2::n_perc0(.data$Education == "None attempted", na_rm = T, show_symbol = T),
             "School grade" = ~ qwraps2::n_perc0(.data$Education == "Vocational or GCSE", na_rm = T, show_symbol = T),
             "Higher education" = ~ qwraps2::n_perc0(.data$Education == "A-level or higher", na_rm = T, show_symbol = T)),
       "Childhood cognition (z-score)" = 
         list("Number" = ~ length(na.omit(.data$Childcog)),
              "Range" = ~ paste(frmt(range(.data$Childcog, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$Childcog, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Smoking" =
         list("Never smoked" = ~ qwraps2::n_perc0(.data$Smoking == "Never smoked", na_rm = T, show_symbol = T),
             "Ex-smoker" = ~ qwraps2::n_perc0(.data$Smoking == "Ex-smoker", na_rm = T, show_symbol = T),
             "Current smoker" = ~ qwraps2::n_perc0(.data$Smoking == "Current smoker", na_rm = T, show_symbol = T)),
       "Major brain disorder" =
         list("None" = ~ qwraps2::n_perc0(.data$MajorBrainDisorder == "None", na_rm = T, show_symbol = T),
              "Present"= ~ qwraps2::n_perc0(.data$MajorBrainDisorder == "Present", na_rm = T, show_symbol = T)),
       "Total intracranial volume (ml)" =
         list("Number" = ~ length(na.omit(.data$TIV)),
              "Range" = ~ paste(frmt(range(.data$TIV, na.rm=T), digits=0), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$TIV, na_rm=T, show_n = "never", denote_sd = "paren", digits=0)),
       "Whole brain volume (ml)" =
         list("Number" = ~ length(na.omit(.data$WBV)),
              "Range" = ~ paste(frmt(range(.data$WBV, na.rm=T), digits=0), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$WBV, na_rm=T, show_n = "never", denote_sd = "paren", digits=0)),
       "Ventricular volume (ml)" =
         list("Number" = ~ length(na.omit(.data$Ventvol)),
              "Range" = ~ paste(frmt(range(.data$Ventvol, na.rm=T), digits=2), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$Ventvol, na_rm=T, show_n = "never", denote_sd = "paren", digits=2)),
       "Hippocampal volume (ml)" =
         list("Number" = ~ length(na.omit(.data$Hippovol)),
              "Range" = ~ paste(frmt(range(.data$Hippovol, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$Hippovol, na_rm=T, show_n = "never", denote_sd = "paren")),
       "White matter hyperintensity volume (ml)" =
         list("Number" = ~ length(na.omit(.data$WMHVol)),
              "Range" = ~ paste(frmt(range(.data$WMHVol, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$WMHVol, na_rm=T, show_n = "never", denote_sd = "paren")),
       "PACC score (z-score)" =
         list("Number" = ~ length(na.omit(.data$PACC)),
              "Range" = ~ paste(frmt(range(.data$PACC, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$PACC, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Amyloid status" =
         list("Negative" = ~ qwraps2::n_perc0(.data$AmyloidStatus == "Negative", na_rm = T, show_symbol = T),
              "Positive"= ~ qwraps2::n_perc0(.data$AmyloidStatus == "Positive", na_rm = T, show_symbol = T)),
       "Amyloid SUVR" = 
        list("Number" = ~ length(na.omit(.data$AmyloidSuvr)),
              "Range" = ~ paste(frmt(range(.data$AmyloidSuvr, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$AmyloidSuvr, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Serum Neurofilament light (pg/ml)" = 
         list("Number" = ~ length(na.omit(.data$SerumNFL)),
              "Range" = ~ paste(frmt(range(.data$SerumNFL, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$SerumNFL, na_rm=T, show_n = "never", denote_sd = "paren")),
       "APOE ε4 status" =
          list("Non-carrier"= ~ qwraps2::n_perc0(.data$ApoE4 == "Non-carrier", na_rm = T, show_symbol = T),
               "Carrier" = ~ qwraps2::n_perc0(.data$ApoE4 == "Carrier", na_rm = T, show_symbol = T)),
       "Alzheimer's Polygenic Risk Score (z-score)" = 
         list("Number" = ~ length(na.omit(.data$PRS)),
              "Range" = ~ paste(frmt(range(.data$PRS, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$PRS, na_rm=T, show_n = "never", denote_sd = "paren")),
       "rs1452628_T Allele number" =
         list("No copies"= ~ qwraps2::n_perc0(.data$rs1452628_T == "0", na_rm = T, show_symbol = T),
              "1 copy" = ~ qwraps2::n_perc0(.data$rs1452628_T == "1", na_rm = T, show_symbol = T),
              "2 copies" = ~ qwraps2::n_perc0(.data$rs1452628_T == "2", na_rm = T, show_symbol = T)),
       "Framingham Risk Score age 36" =
         list("Number" = ~ length(na.omit(.data$FHS_36)),
              "Range" = ~ paste(frmt(range(.data$FHS_36, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$FHS_36, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Framingham Risk Score age 69" =
         list("Number" = ~ length(na.omit(.data$FHS_69)),
              "Range" = ~ paste(frmt(range(.data$FHS_69, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$FHS_69, na_rm=T, show_n = "never", denote_sd = "paren")),
       "FEV1 (L)" =
         list("Number" = ~ length(na.omit(.data$FEV1)),
              "Range" = ~ paste(frmt(range(.data$FEV1, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$FEV1, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Grip strength (kg)" =
          list("Number" = ~ length(na.omit(.data$GripStrength)),
              "Range" = ~ paste(frmt(range(.data$GripStrength, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$GripStrength, na_rm=T, show_n = "never", denote_sd = "paren")),
       "Walking speed (m/s)" =
         list("Number" = ~ length(na.omit(.data$WalkSpeed)),
              "Range" = ~ paste(frmt(range(.data$WalkSpeed, na.rm=T)), collapse=', '),
              "Mean (SD)" =~ qwraps2::mean_sd(.data$WalkSpeed, na_rm=T, show_n = "never", denote_sd = "paren")))
allsummary <- summary_table(allcases, summary1)
mysummary <- summary_table(mydata5, summary1)
completesummary <- summary_table(completedata, summary1)
nfloutliersummary <- summary_table(NFLoutliers, summary1)
comparisonsummary <- cbind(mysummary, completesummary, allsummary, nfloutliersummary)
print(comparisonsummary, 
      rtitle = "Summary Statistics",
      cnames = c("Sample used in study", "Complete cases", "All Insight 46 participants", "sNFL outliers"))
## 
## 
## |Summary Statistics                             |Sample used in study |Complete cases |All Insight 46 participants |sNFL outliers |
## |:----------------------------------------------|:--------------------|:--------------|:---------------------------|:-------------|
## |**Chronological age (years)**                  |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |456                  |305            |502                         |14            |
## |&nbsp;&nbsp; Range                             |69.25, 71.87         |69.25, 71.85   |69.25, 71.87                |69.57, 71.85  |
## |&nbsp;&nbsp; Mean (SD)                         |70.67 (0.67)         |70.61 (0.68)   |70.67 (0.67)                |70.87 (0.79)  |
## |**Brain predicted age (years)**                |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |456                  |305            |468                         |14            |
## |&nbsp;&nbsp; Range                             |46.29, 94.26         |46.29, 94.26   |46.29, 94.26                |55.23, 91.16  |
## |&nbsp;&nbsp; Mean (SD)                         |67.90 (8.15)         |67.79 (8.33)   |67.96 (8.15)                |74.08 (9.74)  |
## |**Brain predicted age difference (years)**     |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |456                  |305            |468                         |14            |
## |&nbsp;&nbsp; Range                             |-24.59, 22.70        |-24.59, 22.70  |-24.59, 22.70               |-16.62, 20.61 |
## |&nbsp;&nbsp; Mean (SD)                         |-2.77 (8.04)         |-2.82 (8.21)   |-2.70 (8.05)                |3.21 (9.77)   |
## |**Sex**                                        |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Female                            |225 (49%)            |152 (50%)      |246 (49%)                   |5 (36%)       |
## |**Socioeconomic status**                       |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Manual                            |70 (15%)             |42 (14%)       |76 (15%)                    |2 (14%)       |
## |&nbsp;&nbsp; Non-manual                        |386 (85%)            |263 (86%)      |426 (85%)                   |12 (86%)      |
## |**Educational attainment**                     |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; None attempted                    |70 (15%)             |45 (15%)       |78 (16%)                    |3 (21%)       |
## |&nbsp;&nbsp; School grade                      |139 (30%)            |97 (32%)       |151 (30%)                   |5 (36%)       |
## |&nbsp;&nbsp; Higher education                  |247 (54%)            |163 (53%)      |273 (54%)                   |6 (43%)       |
## |**Childhood cognition (z-score)**              |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |456                  |305            |502                         |14            |
## |&nbsp;&nbsp; Range                             |-1.60, 2.50          |-1.60, 2.50    |-1.60, 2.50                 |-1.31, 1.25   |
## |&nbsp;&nbsp; Mean (SD)                         |0.41 (0.75)          |0.43 (0.73)    |0.39 (0.74)                 |0.05 (0.76)   |
## |**Smoking**                                    |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Never smoked                      |160 (35%)            |105 (34%)      |171 (34%)                   |4 (29%)       |
## |&nbsp;&nbsp; Ex-smoker                         |280 (61%)            |191 (63%)      |313 (62%)                   |10 (71%)      |
## |&nbsp;&nbsp; Current smoker                    |16 (4%)              |9 (3%)         |18 (4%)                     |0 (0%)        |
## |**Major brain disorder**                       |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; None                              |415 (91%)            |278 (91%)      |460 (92%)                   |12 (86%)      |
## |&nbsp;&nbsp; Present                           |41 (9%)              |27 (9%)        |42 (8%)                     |2 (14%)       |
## |**Total intracranial volume (ml)**             |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |456                  |305            |468                         |14            |
## |&nbsp;&nbsp; Range                             |1,114, 1,939         |1,153, 1,939   |1,114, 1,939                |1,289, 1,600  |
## |&nbsp;&nbsp; Mean (SD)                         |1,431 (133)          |1,431 (131)    |1,433 (133)                 |1,448 (95)    |
## |**Whole brain volume (ml)**                    |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |456                  |305            |468                         |14            |
## |&nbsp;&nbsp; Range                             |819, 1,494           |865, 1,494     |819, 1,494                  |969, 1,263    |
## |&nbsp;&nbsp; Mean (SD)                         |1,099 (99)           |1,100 (99)     |1,100 (99)                  |1,109 (101)   |
## |**Ventricular volume (ml)**                    |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |456                  |305            |468                         |14            |
## |&nbsp;&nbsp; Range                             |6.16, 112.00         |6.50, 112.00   |6.16, 112.00                |18.43, 85.33  |
## |&nbsp;&nbsp; Mean (SD)                         |30.94 (16.34)        |30.09 (15.69)  |31.09 (16.33)               |39.98 (20.85) |
## |**Hippocampal volume (ml)**                    |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |456                  |305            |468                         |14            |
## |&nbsp;&nbsp; Range                             |4.12, 8.54           |4.51, 8.54     |4.12, 8.54                  |4.51, 7.81    |
## |&nbsp;&nbsp; Mean (SD)                         |6.26 (0.67)          |6.29 (0.67)    |6.26 (0.67)                 |6.10 (0.96)   |
## |**White matter hyperintensity volume (ml)**    |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |456                  |305            |470                         |14            |
## |&nbsp;&nbsp; Range                             |0.27, 33.67          |0.27, 33.67    |0.27, 33.67                 |1.22, 24.90   |
## |&nbsp;&nbsp; Mean (SD)                         |5.21 (5.54)          |5.20 (5.65)    |5.21 (5.50)                 |6.95 (7.15)   |
## |**PACC score (z-score)**                       |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |456                  |305            |502                         |14            |
## |&nbsp;&nbsp; Range                             |-3.49, 1.72          |-3.48, 1.72    |-3.49, 1.72                 |-3.48, 1.58   |
## |&nbsp;&nbsp; Mean (SD)                         |-0.01 (0.74)         |0.01 (0.72)    |-0.00 (0.73)                |-0.69 (1.30)  |
## |**Amyloid status**                             |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Negative                          |373 (82%)            |253 (83%)      |378 (82%)                   |10 (71%)      |
## |&nbsp;&nbsp; Positive                          |83 (18%)             |52 (17%)       |84 (18%)                    |4 (29%)       |
## |**Amyloid SUVR**                               |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |456                  |305            |462                         |14            |
## |&nbsp;&nbsp; Range                             |0.40, 1.27           |0.40, 1.25     |0.40, 1.27                  |0.53, 0.97    |
## |&nbsp;&nbsp; Mean (SD)                         |0.59 (0.15)          |0.59 (0.14)    |0.59 (0.15)                 |0.69 (0.15)   |
## |**Serum Neurofilament light (pg/ml)**          |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |456                  |305            |500                         |14            |
## |&nbsp;&nbsp; Range                             |7.26, 124.00         |7.26, 124.00   |7.21, 124.00                |38.60, 124.00 |
## |&nbsp;&nbsp; Mean (SD)                         |20.74 (12.19)        |20.73 (12.97)  |20.73 (11.87)               |69.17 (34.03) |
## |**APOE ε4 status**                             |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Non-carrier                       |325 (71%)            |219 (72%)      |352 (70%)                   |10 (71%)      |
## |&nbsp;&nbsp; Carrier                           |131 (29%)            |86 (28%)       |148 (30%)                   |4 (29%)       |
## |**Alzheimer's Polygenic Risk Score (z-score)** |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |426                  |305            |470                         |13            |
## |&nbsp;&nbsp; Range                             |-3.15, 2.75          |-2.56, 2.60    |-3.15, 2.75                 |-1.55, 2.75   |
## |&nbsp;&nbsp; Mean (SD)                         |-0.06 (1.01)         |-0.03 (1.02)   |-0.08 (1.00)                |-0.21 (1.15)  |
## |**rs1452628_T Allele number**                  |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; No copies                         |169 (40%)            |115 (38%)      |183 (39%)                   |6 (43%)       |
## |&nbsp;&nbsp; 1 copy                            |195 (46%)            |152 (50%)      |217 (47%)                   |6 (43%)       |
## |&nbsp;&nbsp; 2 copies                          |59 (14%)             |38 (12%)       |65 (14%)                    |2 (14%)       |
## |**Framingham Risk Score age 36**               |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |411                  |305            |455                         |12            |
## |&nbsp;&nbsp; Range                             |0.58, 11.25          |0.58, 11.25    |0.58, 11.25                 |1.57, 6.91    |
## |&nbsp;&nbsp; Mean (SD)                         |2.90 (1.74)          |2.93 (1.82)    |2.92 (1.78)                 |3.56 (1.82)   |
## |**Framingham Risk Score age 69**               |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |443                  |305            |488                         |13            |
## |&nbsp;&nbsp; Range                             |2.53, 68.75          |2.53, 68.75    |2.53, 83.87                 |11.67, 50.97  |
## |&nbsp;&nbsp; Mean (SD)                         |25.90 (13.45)        |25.83 (13.38)  |26.16 (13.73)               |27.97 (10.58) |
## |**FEV1 (L)**                                   |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |409                  |305            |450                         |14            |
## |&nbsp;&nbsp; Range                             |0.37, 4.84           |0.37, 4.84     |0.37, 4.84                  |0.84, 4.20    |
## |&nbsp;&nbsp; Mean (SD)                         |2.71 (0.68)          |2.72 (0.67)    |2.72 (0.68)                 |2.73 (0.82)   |
## |**Grip strength (kg)**                         |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |449                  |305            |494                         |14            |
## |&nbsp;&nbsp; Range                             |11.00, 61.50         |13.20, 58.70   |11.00, 61.50                |17.20, 58.60  |
## |&nbsp;&nbsp; Mean (SD)                         |32.99 (10.90)        |33.37 (11.04)  |33.17 (10.93)               |35.54 (13.42) |
## |**Walking speed (m/s)**                        |&nbsp;&nbsp;         |&nbsp;&nbsp;   |&nbsp;&nbsp;                |&nbsp;&nbsp;  |
## |&nbsp;&nbsp; Number                            |431                  |305            |475                         |13            |
## |&nbsp;&nbsp; Range                             |0.57, 2.22           |0.62, 2.22     |0.27, 2.22                  |0.67, 1.84    |
## |&nbsp;&nbsp; Mean (SD)                         |1.08 (0.26)          |1.10 (0.26)    |1.08 (0.26)                 |1.00 (0.29)   |

Sensitivity analysis

Sex

agelesssexlm <- lm(PAD ~ Sex, data=mydata5) 
coefsagelesssex <-  tidy(agelesssexlm , conf.int = TRUE)  #modify estimate and confidence intervals for figure display
coefsagelesssex <- coefsagelesssex %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelesssex$estimate, coefsagelesssex$conf.low, coefsagelesssex$conf.high )) %>% 
  dplyr::filter(term=="Sexmale")

Educational attainment

agelesseducationlm <- lm(PAD ~ Education + Sex, data=mydata5)
coefsagelessedu <-  tidy(agelesseducationlm , conf.int = TRUE)  #modify estimate and confidence intervals for graphical display
coefsagelessedu <- coefsagelessedu %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelessedu$estimate, coefsagelessedu$conf.low, coefsagelessedu$conf.high )) %>% 
    dplyr::filter(term=="EducationVocational or GCSE" | term== "EducationA-level or higher") 

Socioeconomic status

agelesssociolm <- lm(PAD ~ SocioStatus + Sex, data=mydata5)
coefsagelesssocio <-  tidy(agelesssociolm , conf.int = TRUE)  #modify estimate and confidence intervals for graphical display
coefsagelesssocio <- coefsagelesssocio %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelesssocio$estimate, coefsagelesssocio$conf.low, coefsagelesssocio$conf.high )) %>% 
  dplyr::filter(term=="SocioStatusNon-manual")

Childhood cognition (IQ)

agelesschildcoglm <- lm(PAD ~ Childcog + Sex, data=mydata5)
summ(agelesschildcoglm, robust="HC1", digits = 1,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(2,453) 31.2
R² 0.1
Adj. R² 0.1
Est. 2.5% 97.5% t val. p
(Intercept) -5.9 -7.0 -4.8 -10.8 0.0
Childcog 0.8 -0.1 1.7 1.8 0.1
Sexmale 5.5 4.1 6.9 7.8 0.0
Standard errors: Robust, type = HC1
coefsagelesschildcog <-  tidy(agelesschildcoglm , conf.int = TRUE)  #modify estimate and confidence intervals for graphical display
coefsagelesschildcog <- coefsagelesschildcog %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelesschildcog$estimate, coefsagelesschildcog$conf.low, coefsagelesschildcog$conf.high )) %>% 
  dplyr::filter(term=="Childcog")

Modify coeficients for graphical presentation

coefsagelessel <- rbind(coefsagelesssex,  coefsagelesschildcog, coefsagelessedu, coefsagelesssocio)

# Add nicer names
coefsagelessel$names <- factor(c( "Male", "Childhood IQ (z score)", 
                 "Vocational or GCSE", "A level or higher", "Non-manual social class"), 
                 levels = c("Male", "Childhood IQ (z score)", 
                 "Vocational or GCSE", "A level or higher", "Non-manual social class"))

coefsagelessel$type = factor(c("Sex",
               "Childhood cognition",
               rep("Education level (reference: none attempted)", 2),
               "Socioeconomic Status (reference: manual social class)"), 
               levels = c("Sex", "Childhood cognition", "Education level (reference: none attempted)",
               "Socioeconomic Status (reference: manual social class)"))

Ageless contemporary correlates

agelessimagingWBV <- lm(PAD ~ WBVz + TIVz + Sex, data=mydata5)

coefsagelesswbv <-  tidy(agelessimagingWBV , conf.int = TRUE)  #modify estimate and confidence intervals for graphical display
coefsagelesswbv <- coefsagelesswbv %>% 
  dplyr::filter(term=="WBVz") 
coefsagelesswbv <- coefsagelesswbv %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelesswbv$estimate, coefsagelesswbv$conf.low, coefsagelesswbv$conf.high ))

Hippocampi

agelessimaginghippo <- lm(PAD ~ Hippovolz + Sex + TIVz, data=mydata5)
coefsagelesshippo <-  tidy(agelessimaginghippo , conf.int = TRUE)   #modify estimate and confidence intervals for graphical display

coefsagelesshippo <- coefsagelesshippo %>%
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelesshippo$estimate, coefsagelesshippo$conf.low, coefsagelesshippo$conf.high )) %>% 
  dplyr::filter(term=="Hippovolz")

Imaging ventricles

agelessimagingvent <- lm(PAD ~ Ventvolz + TIVz + Sex, data=mydata5)
summ(imagingvent, robust="HC1", scale =T, digits = 4,
            confint=T)
Observations 456
Dependent variable PAD
Type OLS linear regression
F(4,451) 28.8835
R² 0.2039
Adj. R² 0.1969
Est. 2.5% 97.5% t val. p
(Intercept) -3.6218 -4.7462 -2.4974 -6.3301 0.0000
Ventvolz 0.3520 -0.5044 1.2084 0.8077 0.4197
TIVz 2.7190 1.6648 3.7732 5.0686 0.0000
Sexmale 1.6768 -0.1097 3.4632 1.8446 0.0658
Age 0.8685 0.2408 1.4961 2.7193 0.0068
Standard errors: Robust, type = HC1; Continuous predictors are mean-centered and scaled by 1 s.d.
coefsagelessvent <-  tidy(agelessimagingvent , conf.int = TRUE)   #modify estimate and confidence intervals for graphical display
coefsagelessvent <- coefsagelessvent %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelessvent$estimate, coefsagelessvent$conf.low, coefsagelessvent$conf.high )) %>% 
  dplyr::filter(term=="Ventvolz")

Imaging WMH

agelessimagingwmh <- lm(PAD ~ WMHVolz + TIVz + Sex, data=mydata5)
coefsagelessWMH <-  tidy(agelessimagingwmh, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefsagelessWMH <- coefsagelessWMH %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelessWMH$estimate, coefsagelessWMH$conf.low, coefsagelessWMH$conf.high )) %>% 
  dplyr::filter(term=="WMHVolz")

Combine results of brain imaging models for graphical display

coefsagelessimaging <- rbind(coefsagelesswbv, coefsagelesshippo, coefsagelessvent, coefsagelessWMH)
# Add nicer names
coefsagelessimaging$names <- factor(c( "Whole brain (z score)", "Hippocampi (z score)", "Ventricles (z score)", "WMH (z score)"), levels = c("WMH (z score)", "Ventricles (z score)", "Hippocampi (z score)", "Whole brain (z score)"))
# Group the variables 
coefsagelessimaging$type = rep("MR Imaging volumes", 4)
agelessNFLlm <- lm(PAD ~ SerumNFLz + Sex + Age, data = mydata5)
coefsagelessNFL <-  tidy(agelessNFLlm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefsagelessNFL <- coefsagelessNFL %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelessNFL$estimate, coefsagelessNFL$conf.low, coefsagelessNFL$conf.high )) %>% 
  dplyr::filter(term=="SerumNFLz")
agelesssuvrlm <- lm(PAD ~ AmyloidSuvrz + Sex, data = mydata5)
coefsagelesssuvr <-  tidy(agelesssuvrlm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefsagelesssuvr <- coefsagelesssuvr %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelesssuvr$estimate, coefsagelesssuvr$conf.low, coefsagelesssuvr$conf.high )) %>% 
  dplyr::filter(term=="AmyloidSuvrz")
coefsagelessbiomarker <- rbind(coefsagelessNFL, coefsagelesssuvr)
coefsagelessbiomarker
# Add nicer names and variable types
coefsagelessbiomarker$names <- c( "Serum NFL (z score)", "Florbetapir SUVR (z score)")
coefsagelessbiomarker$type = rep("Blood and Imaging Biomarkers", 2)

Cognition

agelesscoglm <- lm(PAD ~ PACC + Sex + Education + Childcog + SocioStatus, data = mydata5)
coefsagelesscog <-  tidy(agelesscoglm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefsagelesscog <- coefsagelesscog %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelesscog$estimate, coefsagelesscog$conf.low, coefsagelesscog$conf.high )) %>% 
  dplyr::filter(term =="PACC")
coefsagelesscog$names <- c( "PACC (z score)")
coefsagelesscog$type = rep("Cognition", 1)
agelessdisorderlm <- lm(PAD ~ MajorBrainDisorder + Sex, data = mydata5)
coefsagelessdisorder <-  tidy(agelessdisorderlm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefsagelessdisorder <- coefsagelessdisorder %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelessdisorder$estimate, coefsagelessdisorder$conf.low, coefsagelessdisorder$conf.high )) %>% 
  dplyr::filter(term =="MajorBrainDisorderPresent")
coefsagelessdisorder$names <- c( "Major Brain Disorder")
coefsagelessdisorder$type = rep("Comorbidities", 1)

Physical attributes regression

agelessFEV1lm <- lm(PAD ~ FEV1z + Smoking + Heightz + Sex, data = mydata5)
coefsagelessFEV1 <-  tidy(agelessFEV1lm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefsagelessFEV1 <- coefsagelessFEV1 %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelessFEV1$estimate, coefsagelessFEV1$conf.low, coefsagelessFEV1$conf.high )) %>%
  dplyr::filter(term == "FEV1z")
agelessgriplm <- lm(PAD ~ GripStrengthz + Sex, data = mydata5)
coefsagelessgrip <-  tidy(agelessgriplm, conf.int = TRUE)   #modify estimate and confidence intervals for graphical display
coefsagelessgrip <- coefsagelessgrip %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelessgrip$estimate, coefsagelessgrip$conf.low, coefsagelessgrip$conf.high )) %>%
  dplyr::filter(term == "GripStrengthz")
agelesswalklm <- lm(PAD ~ WalkSpeedz  + Heightz + Sex, data = mydata5)

coefsagelesswalk <-  tidy(agelesswalklm, conf.int = TRUE)    #modify estimate and confidence intervals for graphical display
coefsagelesswalk <- coefsagelesswalk %>% 
  mutate(display_ests = sprintf("%.1f [%.1f, %.1f]" , coefsagelesswalk$estimate, coefsagelesswalk$conf.low, coefsagelesswalk$conf.high )) %>%
  dplyr::filter(term == "WalkSpeedz")


coefsagelessphysical <- rbind(coefsagelessFEV1, coefsagelessgrip, coefsagelesswalk)

# Add nicer names and variable types
coefsagelessphysical$names <- c("FEV1 (z score)", "Grip strength (z score)",  "Walking speed (z score)")
coefsagelessphysical$type = rep("Physical metrics", 3)

Combined forest plots

fullagelesscoefsassoc <- rbind(coefsagelessbiomarker, coefsagelesscog, coefsagelessdisorder, coefsagelessphysical, coefsagelessel, coefsagelessimaging)
fullagelesscoefsassoc$type <- factor(fullagelesscoefsassoc$type, levels=c("Sex", "Childhood cognition", "Education level (reference: none attempted)", "Socioeconomic Status (reference: manual social class)", "Cardiovascular Risk", "Genetics", "Blood and Imaging Biomarkers", "Cognition", "Comorbidities", "Physical metrics", "MR Imaging volumes"))
fullagelesscoefsassoc$names <- fct_relevel(fullagelesscoefsassoc$names, "A level or higher", "Florbetapir SUVR (z score)", "WMH (z score)", "Hippocampi (z score)", "Ventricles (z score)", "Walking speed (z score)", "Grip strength (z score)") 
(fullagelessassocgraph <- ggplot(fullagelesscoefsassoc, aes(estimate, names )) + 
  geom_point(aes(), size=0.9)+ 
  geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), height = 0, size = 0.4)+
  geom_text(aes(x = Inf, label = display_ests), vjust = 0.5, colour = "black", hjust = -0.1, size = 3.5) +
  coord_cartesian(clip = "off") +
  geom_vline(xintercept = 0, linetype = 2)+
  theme_bw(base_size = 12)+
  theme(plot.margin = unit(c(1,4,0.5,0.5), "cm")) +
   theme(panel.border = element_rect(fill = NA, colour="black", size = 0.33)) +
  labs(x =  NULL,y = NULL, title = NULL)+
   facet_col(~type, scale = "free_y", space = "free") +
   theme(strip.background = element_rect(fill="grey85", colour="black")))  

11 Version control

print(version)
##                _                           
## platform       x86_64-apple-darwin17.0     
## arch           x86_64                      
## os             darwin17.0                  
## system         x86_64, darwin17.0          
## status                                     
## major          4                           
## minor          0.3                         
## year           2020                        
## month          10                          
## day            10                          
## svn rev        79318                       
## language       R                           
## version.string R version 4.0.3 (2020-10-10)
## nickname       Bunny-Wunnies Freak Out
print(sessionInfo())
## R version 4.0.3 (2020-10-10)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Catalina 10.15.7
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_AU.UTF-8/en_AU.UTF-8/en_AU.UTF-8/C/en_AU.UTF-8/en_AU.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] ggforce_0.3.2    jtools_2.1.2     skimr_2.1.2      broom_0.7.4     
##  [5] ggpubr_0.4.0     forcats_0.5.1    stringr_1.4.0    dplyr_1.0.3     
##  [9] purrr_0.3.4      readr_1.4.0      tidyr_1.1.2      tibble_3.0.6    
## [13] ggplot2_3.3.3    tidyverse_1.3.0  qwraps2_0.5.0    psych_2.0.12    
## [17] kableExtra_1.3.1 ggExtra_0.9     
## 
## loaded via a namespace (and not attached):
##  [1] nlme_3.1-151      fs_1.5.0          lubridate_1.7.9.2 webshot_0.5.2    
##  [5] httr_1.4.2        repr_1.1.3        tools_4.0.3       backports_1.2.1  
##  [9] R6_2.5.0          mgcv_1.8-33       DBI_1.1.1         colorspace_2.0-0 
## [13] withr_2.4.1       tidyselect_1.1.0  mnormt_2.0.2      curl_4.3         
## [17] compiler_4.0.3    cli_2.2.0         rvest_0.3.6       xml2_1.3.2       
## [21] sandwich_3.0-0    labeling_0.4.2    scales_1.1.1      digest_0.6.27    
## [25] foreign_0.8-81    rmarkdown_2.6     rio_0.5.16        base64enc_0.1-3  
## [29] pkgconfig_2.0.3   htmltools_0.5.1.1 highr_0.8         dbplyr_2.0.0     
## [33] fastmap_1.1.0     rlang_0.4.10      readxl_1.3.1      rstudioapi_0.13  
## [37] shiny_1.6.0       farver_2.0.3      generics_0.1.0    zoo_1.8-8        
## [41] jsonlite_1.7.2    zip_2.1.1         car_3.0-10        magrittr_2.0.1   
## [45] Matrix_1.3-2      Rcpp_1.0.6        munsell_0.5.0     fansi_0.4.2      
## [49] abind_1.4-5       lifecycle_0.2.0   stringi_1.5.3     yaml_2.2.1       
## [53] carData_3.0-4     MASS_7.3-53       grid_4.0.3        parallel_4.0.3   
## [57] promises_1.1.1    crayon_1.4.0      miniUI_0.1.1.1    lattice_0.20-41  
## [61] cowplot_1.1.1     splines_4.0.3     haven_2.3.1       pander_0.6.3     
## [65] hms_1.0.0         tmvnsim_1.0-2     knitr_1.31        pillar_1.4.7     
## [69] ggsignif_0.6.0    reprex_1.0.0      glue_1.4.2        evaluate_0.14    
## [73] data.table_1.13.6 modelr_0.1.8      tweenr_1.0.1      vctrs_0.3.6      
## [77] httpuv_1.5.5      cellranger_1.1.0  polyclip_1.10-0   gtable_0.3.0     
## [81] assertthat_0.2.1  xfun_0.20         openxlsx_4.2.3    mime_0.9         
## [85] xtable_1.8-4      rstatix_0.6.0     later_1.1.0.1     viridisLite_0.3.0
## [89] ellipsis_0.3.1